package hl.crazy_java.chapter_18.reflect;

import hl.crazy_java.chapter_18.Person;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * 
 * @author Liu Huan
 */


public class demoMethod {
	/**
	 1、获取成员变量们
	 Field getField(String name)
	 Field[] getFields()
	 Field getDeclaredField(String name)
	 Field[] getDeclaredFields()
	 2、获取成员方法们
	 Method getMethod(String name, Class<?>... parameterTypes)
	 Method[] getMethods()
	 Method getDeclaredMethod(String name, Class<?>... parameterTypes)
	 Method[] getDeclaredMethods()
	 Method getEnclosingMethod()
	 3、获取构造器们
	 Constructor<T>getConstructor(Class<?>... parameterTypes)	
	 Constructor<?>[]getConstructors()
	 Constructor<T>getDeclaredConstructor(Class<?>... parameterTypes)
	 Constructor<?>[]getDeclaredConstructors()
	 Constructor<?>getEnclosingConstructor()
	 4、获取类名，包名
	 String getName()
	 String getPackageName()
	 */
	public static void main(String[] args) throws Exception {
		//获取 Class 对象
		Class personClass = Person.class;
		
		//获取 任一修饰的 所有此类中声明的方法 不包括父类的 并打印
		Method[] declaredMethods = personClass.getDeclaredMethods();
		for (Method declaredMethod : declaredMethods) {
			System.out.println(declaredMethod);
		}
		//获取 任一修饰的 所有方法 包括父类的 并打印
		System.out.println("------");
		Method[] methods = personClass.getMethods();
		for (Method method : methods) {
			System.out.println(method);
		}
		
		//获取 任一修饰的 某个方法 并执行
		Method eat = personClass.getDeclaredMethod("eat", String.class);
		Person person = new Person();
		eat.invoke(person, "apple");
		
		
		//获取包名类名
		System.out.println("----------");
		System.out.println(personClass.getName());
		System.out.println(personClass.getPackageName());
		
	}
    
}
